#ifndef __BHTTP_REQUEST_H__
#define __BHTTP_REQUEST_H__
#pragma once

#include <string>
#include <vector>
#include <map>

namespace bhttp
{
// HTTP方法
enum class method
{
    UNKNOWN,
    GET,
    POST,
    DEL,
    PUT,
    PATCH
};

// 认证类型
enum class auth
{
    NO,
    BASIC
};

//struct formpart
//{
//    std::string name;
//    std::string data;
//    std::string ctype;
//    std::string fname;
//    std::string fpath;
//};

class request
{
public:
    explicit request(const std::string& path = std::string()
        , const bhttp::method& tp = bhttp::method::GET);
    ~request();

    void path(const std::string& path);
    const std::string& path() const;

    void method(const bhttp::method& tp);
    const bhttp::method& method() const;

    /**
     * @brief timeout 设置请求超时时间
     * @param secs 时间值(秒)
     * @return void
     */
    void timeout(int secs);
    /**
     * @brief timeout 返回请求超时时间
     * @return 超时时间
     */
    int timeout() const;

    /**
     * @brief auth_type 设置认证类型
     * @param type 认证类型
     * @return void
     */
    void auth_type(const bhttp::auth& type);
    /**
     * @brief auth_type 返回认证类型
     * @return 认证类型
     */
    const bhttp::auth& auth_type() const;

    /**
     * @brief auth_data 设置认证数据
     * @param data 认证数据
     * @return void
     */
    void auth_data(const std::string& data);
    /**
     * @brief auth_data 返回认证数据
     * @return 认证数据
     */
    const std::string& auth_data() const;

    void body(const std::string& str);
    void body(const char* buffer, size_t len);
    const char* body() const;
    size_t body_size() const;

    /**
     * @brief headers 设置HTTP Header
     * @param hds HTTP Header数据
     * @return void
     */
    void headers(const std::map<std::string, std::string>& hds);
    /**
     * @brief headers 返回HTTP Headers
     * @return HTTP Headers
     */
    const std::vector<std::string>& headers() const;
    /**
     * @brief header 设置HTTP Header
     * @param key HTTP Header Key
     * @param value HTTP Header Value
     * @return void
     */
    void header(const std::string& key, const std::string& value);
    /**
     * @brief header 返回对应key的HTTP Header Value
     * @param key HTTP Header Key
     * @return HTTP Header Value
     */
    std::string header(const std::string& key);

    void parmas(const std::map<std::string, std::string>& parmas);
    void parma(const std::string& key, const std::string& value);
    std::string parma(const std::string& key);
    const std::map<std::string, std::string>& parmas() const;

    //void form(const formpart& fm);
    //void forms(const std::vector<formpart>& fms);
    //void forms(std::vector<formpart>&& fms);
    //const std::vector<formpart> forms() const;
private:
    // 请求路径
    std::string	path_;
    // HTTP方法
    bhttp::method method_;
    // 认证类型
    bhttp::auth auth_type_{ bhttp::auth::NO };
    // 认证数据 {账号:密码}
    std::string auth_data_;
    // 请求超时时间(秒)
    int timeout_{ 10 };
    // 请求参数
    std::map<std::string, std::string> parmas_;
    // 请求头
    std::vector<std::string> headers_;
    // 请求体
    std::vector<char> body_;
    //std::vector<formpart> forms_;
};
}
#endif //__BHTTP_REQUEST_H__
